在收租之前,我們得先來想想如何打好地基、建造出理想中的房子,接著就能進行房間隔局的設計。乍看之下有很多前置工作,但其實並不困難,現在讓我們開始吧!
本系列文章會在 Linux Ubuntu 作業系統下進行示範,並使用 Docker 容器化各項服務來減少繁瑣的安裝程序。
使用 Python 為主要開發語言,Django 則會採用有長期支持(LTS) 3.2 版本。將會安裝 PostgresSQL 的 schema 來進行資料隔離,最後的部署階段會用 Nginx 來做為我們的網路伺服器。
這裡建議想跟著文章一起走的讀者安裝一台 Ubuntu 的虛擬機與 VScode 編輯器,學習體驗更佳!(本文礙於篇幅就不贅述安裝教學,請自行上網尋找教學囉)
作業系統:Ubuntu 22.04
Python 版本:3.10.4
Django 版本:3.2
PostgresSQL 版本:14.4
Nginx 版本:1.21.1
Docker 是一種軟體平台,可以用於建置、部署及管理容器化的應用程式。
Docker Container (容器)可以想像是一個獨立隔離的虛擬化環境,透過容器化我們可以將應用程式、資料庫分開管理而不互相影響,還能夠自動建立、重複使用與版本化管理。而有多個容器時在本地主機(安裝 Docker 的主機)可以透過多容器工具(例如 Docker Compose)進行整合來建立與啟動所有服務。
設定 apt 套件,並允許透過 HTTPS
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
加入 Docker GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
設置儲存庫
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安裝 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
測試是否安裝完成
sudo docker run hello-world
...
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
安裝 Docker Compose
docker compose version
...
Docker Compose version v2.6.0
不習慣使用 CLI,使用自訂別名
echo 'alias docker-compose="docker compose"' >> ~/.bashrc
source ~/.bashrc
docker-compose version
...
Docker Compose version v2.6.0
以非 root 身分管理 Docker,,使用 vscode 管理很方便(此方式安全性較低,正式環境請斟酌使用)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
sudo chmod 666 /var/run/docker.sock
到這裡,我們已經把 Docker 的環境架設完成了
接著要建立我們的專案主目錄,這裡的範例專案命名為 example_tenant
mkdir ~/example_tenant
在目錄底下建立一個 Dockerfile
cd ~/example_tenant
touch Dockerfile
在 Dockerfile 編輯以下內容
FROM ubuntu:22.04
# set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV TZ="Asia/Taipei"
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
# Install python 3.10
RUN apt-get update -y
RUN apt-get install python3.10 python3.10-dev -y
建立 image
docker build -t example_tenant . # 使用當前目錄的 Dockerfile 建立容器
...
Successfully built 0e2dc7586b91
Successfully tagged example_tenant:latest
測試運行
docker run -it example_tenant /bin/bash # 運行並進入容器
python3.10
...
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
成功在 Docker 環境裡面運行 Python 3.10 囉!
為什麼要使用 Docker 呢?筆者會開始使用 Docker 是曾經同時開發太多專案,一直開關各專案的服務來切換環境真的很耗心力。
自從開始使用 Docker 來進行容器化管理,就像是從現實世界到了魔法世界,理解原理與指令後如同學會了魔法,複雜的環境都能梳理的井井有條,不得不說兩個字 —— 真香。
明天我們會接續下去,『蓋一棟 Django 小屋』將 Django 與 PostgreSQL 一起運行起來。